package com.browsesoft;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.LinkedList;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 对象管理器
 */
public class ManagerGroup extends UnicastRemoteObject implements
		ManagerGroupRMI {
	/**
	 * 
	 */
	private static final long serialVersionUID = -9001856954118682651L;

	// 记录管理器
	private Hashtable managers = new Hashtable();

	// 记录自己
	transient private static ManagerGroup managerGroup = null;

	/**
	 * 空构造函数
	 * 
	 * @throws RemoteException
	 */
	public ManagerGroup() throws RemoteException {
		managerGroup = this;
	}

	/**
	 * 得到自己的引用
	 * 
	 * @return 自己的引用
	 */
	public static ManagerGroup getManagerGroup() {
		return managerGroup;
	}

	/**
	 * 装载对象
	 * 
	 * @throws Exception
	 */
	public void load() throws Exception {
		Document doc = (Document) PropertiesService.getDocument();
		// 取得对象列表
		NodeList list = doc.getElementsByTagName("manager");
		Node tag = list.item(0);
		NodeList children = tag.getChildNodes();
		for (int i = 0; i < children.getLength(); i++) {
			if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {
				Element child = (Element) children.item(i);
				// 绑定的名字
				String name = child.getTagName();
				// 类名
				String className = child.getAttribute("classname");
				// 管理器
				Manager manager = (Manager) Class.forName(className)
						.newInstance();
				// 装载
				System.out.println("loading " + className);
				try {
					manager.load();
				} catch (Exception e) {
					// 某个管理器加载出错，打印错误后，继续让其他管理器加载
					e.printStackTrace();
				}
				System.out.println("loaded " + className);
				// 保存载管理器组
				managers.put(name, manager);
			}
		}
	}

	/**
	 * 根据id得到对象
	 * 
	 */
	public Object getObject(String id) {
		LinkedList name = new LinkedList();
		Enumeration en = managers.keys();
		// 得到管理器名列表
		while (en.hasMoreElements()) {
			name.add((String) en.nextElement());
		}
		for (int i = 0; i < name.size(); i++) {
			// 得到管理器
			Manager manager = (Manager) managers.get((String) name.get(i));
			// 从管理器中取出对象
			Object object = manager.getObject(id);
			if (object != null) {
				return object;
			}
		}
		return null;
	}

	/**
	 * 根据名字取的管理器
	 * 
	 * @param name
	 *            名字
	 * @return 管理器
	 */
	public Manager getManager(String name) throws RemoteException {
		return (Manager) managers.get(name);
	}
}